<?php
namespace app\lawcase\model;

use think\Model;
use think\facade\Db;
use think\facade\Log;

class Lawcase extends Model
{
    protected $dateFormat = false; // 禁用日期格式自动转换

    // 字段映射
    public static $caseTypeMap = [
        '民事',
        '刑事',
        '行政'
    ];

    public static $stageMap = [
        '（民）诉前阶段',
        '（民）一审阶段',
        '（民）二审阶段',
        '（民）再审阶段',
        '（民）执行阶段',
        '（民）一审、二审及执行阶段',
        '（刑）侦察阶段',
        '（刑）审查起诉阶段',
        '（刑）审判阶段',
        '（刑）执行阶段',
        '（行政）起诉与受理',
        '（行政）审理前的准备',
        '（行政）审理阶段',
        '（行政）判决阶段‌',
        '（行政）执行阶段',
        '其他',
    ];

    public static $statusMap = [
        '准备阶段（未提交立案）',
        '起诉阶段（提交立案待受理）',
        '庭前阶段（立案受理未开庭）',
        '审判阶段（已开庭未出判决）',
        '庭后阶段（已判决未生效）',
        '执行阶段（判决生效）',
        '结案',
        '撤诉',
        '终止委托'
    ];


    /**
     * 获取案件类型文本
     * @param string $caseType 案件类型值
     * @return string
     */
    protected function getCaseTypeText($caseType)
    {
        return isset($this->caseTypeMap[$caseType]) ? $this->caseTypeMap[$caseType] : '未知类型';
    }

    /**
     * 获取案件阶段文本
     * @param string $caseStep 案件阶段值
     * @return string
     */
    protected function getStageText($stage)
    {
        return $this->stageMap[$stage] ?? '未知阶段';
    }

    /**
     * 获取案件状态文本
     * @param string $status 案件状态值
     * @return string
     */
    protected function getStatusText($status)
    {
        return isset($this->statusMap[$status]) ? $this->statusMap[$status] : '未知状态';
    }

    /**
     * 添加案件
     * @param array $param
     * @return array
     */
    public function addCase(array $param)
    {
        try {
            $param['create_time'] = time();
            $insertId = self::strict(false)->field(true)->insertGetId($param);
            add_log('add', $insertId, $param);
        } catch (\Exception $e) {
            return ['code' => 1, 'msg' => '添加失败：' . $e->getMessage()];
        }
        return to_assign(0,'操作成功',['return_id'=>$insertId]);
    }

    /**
     * 编辑案件
     * @param array $param
     * @return array
     */
    public function editCase(array $param)
    {
        try {
            $param['update_time'] = time();
            $this->strict(false)->where('id', $param['id'])->update($param);
            add_log('edit', $param['id'], $param);
        } catch (\Exception $e) {
            return ['code' => 1, 'msg' => '编辑失败：' . $e->getMessage()];
        }
        return to_assign(0,'操作成功',['return_id'=>$param['id']]);
    }

    /**
     * 删除案件
     * @param int $id
     * @return array
     */
    public function removeCase(int $id)
    {
        try {
            $param['delete_time'] = time();
            $this->strict(false)->where('id', $id)->update(['delete_time'=>time()]);
            add_log('delete', $id);
        } catch(\Exception $e) {
            return to_assign(1, '操作失败，原因2：'.$e->getMessage());
        }

        return to_assign();
    }

    /**
     * 获取单个案件信息
     * @param int $id
     * @return array|null
     */
    public function getCase(int $id)
    {
        if ($id <= 0) {
            return ['code' => 1, 'msg' => '无效的案件ID'];
        }
        $case = $this->where('id', $id)->find();
        if ($case) {
            $case = $case->toArray();

            // 根据案由ID，通过案由模型获取案由名称
            $case_cause = Db::name('case_cause')->where('id', $case['case_cause_id'])->find();
            $case['case_cause_name'] = $case_cause? $case_cause['name'] : '';
            // 根据法院ID获取法院
            $cort_name = Db::name('court')->where('id', $case['court_id'])->value('name');
            $case['court_name'] = $cort_name? $cort_name : '';
            // 新增开庭处所名称查询
            $session_court_name = Db::name('court')->where('id', $case['session_court_id'])->value('name');
            $case['session_court_name'] = $session_court_name ? $session_court_name : '';
            //根据关联合同ID，获取合同名称
            $contract_name = Db::name('contract')->where('id', $case['contract_id'])->value('name');
            $case['contract_name'] = $contract_name? $contract_name : '';
            // 获取管家姓名
            $secondary_lawyer_name = Db::name('admin')->where('id', $case['secondary_lawyer'])->value('name');
            $case['secondary_lawyer_name'] = $secondary_lawyer_name ? $secondary_lawyer_name : '';
            // 转换时间格式
            if (!empty($case['session_time'])) {
                $case['session_time'] = date('Y-m-d H:i:s', $case['session_time']);
            }

            return ['code' => 0, 'msg' => '获取成功', 'data' => $case];
        } else {
            return ['code' => 1, 'msg' => '案件信息不存在'];
        }
    }

    /**
     * 获取案件列表（带分页）
     * @param array $where 查询条件
     * @param array $param 分页参数
     * @return array|\think\Paginator
     */
    public function getList($where = [], $param = [])
    {
        // 构建基础查询
        $query = $this->where($where)->where('delete_time', 0);
    
        // 关键词搜索（案件编号或委托人名称）
        if (!empty($param['keywords'])) {
            $query->where(function($q) use ($param) {
                $q->whereLike('case_code', "%{$param['keywords']}%")
                ->whereOr(function($query) use ($param) {
                    $query->whereExists(function($query) use ($param) {
                        $query->table('oa_lawcase_party cp')
                            ->join('oa_party p', 'cp.party_id = p.id')
                            ->where('cp.case_id = oa_lawcase.id')
                            ->where('cp.delete_time', 0)
                            ->where('cp.is_client', 1)
                            ->whereLike('p.name', "%{$param['keywords']}%");
                    });
                });
            });
        }
    
        // 主办律师查询
        if (!empty($param['main_lawyer'])) {
            $query->where('main_lawyer', $param['main_lawyer']);
        }
    
        // 管家查询
        if (!empty($param['secondary_lawyer'])) {
            $query->where('secondary_lawyer', $param['secondary_lawyer']);
        }
    
        // 案件状态查询
        if (!empty($param['status'])) {
            $query->where('status', $param['status']);
        }


        // 设置排序和分页
        $order = empty($param['order']) ? 'id desc' : $param['order'];
        $query->order($order);
        
        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];

        try {
            $result = $query->paginate([
                'list_rows' => $rows,
                'query' => $param
            ]);

            // 格式化每条数据
            $result->each(function($item) {
                //根据案由ID，通过案由模型获取案由名称
                $case_cause = Db::name('case_cause')->where('id', $item->case_cause_id)->find();
                $item->case_cause_name = $case_cause ? $case_cause['name'] : '';
                //根据法院ID获取法院
                $cort_name = Db::name('court')->where('id', $item->court_id)->value('name');
                $item->court_name = $cort_name ? $cort_name : '';
                //根据主办律师ID，获取律师名称
                $main_lawyer_name = Db::name('admin')->where('id', $item->main_lawyer)->value('name');
                $item->main_lawyer_name = $main_lawyer_name? $main_lawyer_name : '';
                
                //根据管家ID，获取管家姓名
                $secondary_lawyer_name = Db::name('admin')->where('id', $item->secondary_lawyer)->value('name');
                $item->secondary_lawyer_name = $secondary_lawyer_name ? $secondary_lawyer_name : '';
                
                // 获取关联委托人信息
                $parties = Db::name('lawcase_party')
                    ->alias('cp')
                    ->join('party p', 'cp.party_id = p.id')
                    ->where('cp.case_id', $item->id)
                    ->where('cp.delete_time', 0)
                    ->where('cp.is_client', 1)
                    ->field('p.name, p.id')
                    ->select();
                    
                $item->party_names = $parties ? array_column($parties->toArray(), 'name') : [];
                $item->party_ids = $parties ? array_column($parties->toArray(), 'id') : [];
                
                // 新增：获取对方当事人信息
                $opposite_parties = Db::name('lawcase_party')
                    ->alias('cp')
                    ->join('party p', 'cp.party_id = p.id')
                    ->where('cp.case_id', $item->id)
                    ->where('cp.delete_time', 0)
                    ->where('cp.is_client', 2)  // 对方当事人
                    ->field('p.name, p.id')
                    ->select();
                    
                $item->opposite_party_names = $opposite_parties ? array_column($opposite_parties->toArray(), 'name') : [];
                    
                return $item;
            });

            return $result;
        } catch (\Exception $e) {
            Log::error('获取案件列表失败：' . $e->getMessage());
            return ['code' => 1, 'msg' => $e->getMessage(), 'data' => []];
        }
    }
}
